package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.Collection;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.scp.dao.IDAOCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;

/**
 *
 * @author usuario
 */
@Repository("daoCorrelativoDocumento")
public class DAOCorrelativoDocumentoImpl extends DaoImpl<CorrelativoDocumento, Integer> implements IDAOCorrelativoDocumento, Serializable {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    @Override
    public CorrelativoDocumento obtenerCorrelativoDocumentoPorAnio(CorrelativoDocumento correlativo) throws DAOException {
        CorrelativoDocumento documentoCorrelativo = new CorrelativoDocumento();
        try {
            sessionFactory.getCurrentSession().flush();

            documentoCorrelativo = (CorrelativoDocumento) sessionFactory.getCurrentSession().createCriteria(CorrelativoDocumento.class)
                    .createAlias("idsede", "se")
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("anio", correlativo.getAnio()))
                    .add(Restrictions.eq("se.idEmpresa", correlativo.getIdsede().getIdEmpresa()))
                    .add(Restrictions.eq("idTipoDocumento", correlativo.getIdTipoDocumento()))
                    .uniqueResult();

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return documentoCorrelativo;
    }

    @Transactional
    @Override
    public CorrelativoDocumento obtenerCorrelativoDocumentoPorAnio2(CorrelativoDocumento correlativo) throws DAOException {
        CorrelativoDocumento documentoCorrelativo = new CorrelativoDocumento();
        try {
            sessionFactory.getCurrentSession().flush();
            System.out.println("año: " + correlativo.getAnio());
            //System.out.println("empresa: "+correlativo.getIdsede().getIdEmpresa());            
            System.out.println("documento: " + correlativo.getIdTipoDocumento());

            documentoCorrelativo = (CorrelativoDocumento) sessionFactory.getCurrentSession().createCriteria(CorrelativoDocumento.class)
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("anio", correlativo.getAnio()))
                    .add(Restrictions.eq("idTipoDocumento", correlativo.getIdTipoDocumento()))
                    .uniqueResult();

            //.createAlias("idsede", "se")
            // .add(Restrictions.eq("se.idEmpresa", correlativo.getIdsede().getIdEmpresa()))
            System.out.println("documento encontrado: " + documentoCorrelativo);
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return documentoCorrelativo;
    }

    @Override
    public CorrelativoDocumento obtenerCorrelativoTipoDocSede(int idtipodoc, int idsede) throws DAOException {
        CorrelativoDocumento correlativo = null;
        try {

            correlativo = (CorrelativoDocumento) sessionFactory.getCurrentSession().createSQLQuery("SELECT * FROM cotelasa.correlativo_documento WHERE id_tipo_documento=:tipodoc AND id_sede=:sede")
                    .addEntity(CorrelativoDocumento.class)
                    .setParameter("tipodoc", idtipodoc)
                    .setParameter("sede", idsede)
                    .uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }
        return correlativo;
    }

    @Override
    public CorrelativoDocumento obtenerCorrelativoTipoDocSede1(CorrelativoDocumento correlativo) throws DAOException {
        CorrelativoDocumento documentoCorrelativo = new CorrelativoDocumento();
        try {
            sessionFactory.getCurrentSession().flush();

            documentoCorrelativo = (CorrelativoDocumento) sessionFactory.getCurrentSession().createCriteria(CorrelativoDocumento.class)
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("serie", correlativo.getSerie()))
                    .add(Restrictions.eq("idsede", correlativo.getIdsede()))
                    .add(Restrictions.eq("idTipoDocumento", correlativo.getIdTipoDocumento()))
                    .uniqueResult();

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return documentoCorrelativo;
    }

    @Override
    public Collection<String> obtenerSeriePorTipoDoc(int idtipodoc, int idEmpresa) throws DAOException {
        Collection<String> series = null;
        try {
            series = sessionFactory.getCurrentSession().createCriteria(CorrelativoDocumento.class)
                    .createAlias("idsede", "se")
                    .createAlias("se.idEmpresa", "em")
                    .addOrder(Order.asc("serie"))
                    .add(Restrictions.eq("idTipoDocumento.id", idtipodoc))
                    .add(Restrictions.eq("em.id", idEmpresa))
                    .setProjection(Projections.distinct(Projections.property("serie")))
                    .list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }
        return series;
    }
}
